This is the results section for the Study 2 NSE & SE CHILDREN watching ASL Stories. We have two main factors:

  1. Language (Sign v. English)
  2. Direction (Forward v. Reversed)

We are taking out one older KODA (Ethan, 10.5 yrs) to balance the groups better.

Demographics

Let’s plot the ages, and check if there is significant difference in ages between the two groups?


    Welch Two Sample t-test

data:  nse_age$age and se_age$age
t = 0.14316, df = 32.568, p-value = 0.887
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.020020  1.174354
sample estimates:
mean of x mean of y 
 4.986667  4.909500 

Global Looking

For children, we calculated percentages based on overall clip length as the denominator. In this way, we can meaningfully contrast looking times at the videos (which are variable lengths) based on different factors. But when we go to AOI analysis we need to re-calculate the percentages so the denominator is based on total looking time, not overall clip length.

The chart below shows there seems to be an effect of age; older kids look longer at it than younger kids. Maybe not too surprising. It means we need to keep age in any models we run. Let’s analyze a bit more below.

A linear model shows a significant effect of age. Overall, Age seems to increase overall looking by about 3% every year. However, there are no differences between NSE v. SE, or reversal, on how long they looked, so that’s good.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: percent ~ age + lang * direction + trial + (1 | name) + (1 |  
    story)
   Data: kids_overall_looking

REML criterion at convergence: -117.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7744 -0.6050  0.1442  0.7279  2.3714 

Random effects:
 Groups   Name        Variance  Std.Dev.
 name     (Intercept) 0.0081056 0.09003 
 story    (Intercept) 0.0001316 0.01147 
 Residual             0.0383127 0.19574 
Number of obs: 471, groups:  name, 35; story, 8

Fixed effects:
                           Estimate Std. Error         df t value Pr(>|t|)
(Intercept)                0.643092   0.065827  37.609535   9.769 7.26e-12
age                        0.032480   0.011297  30.811447   2.875  0.00726
langSE                     0.030353   0.040231  48.089632   0.754  0.45425
directionreversed         -0.021725   0.027676 337.762425  -0.785  0.43301
trial                     -0.008267   0.002011 210.607832  -4.111 5.64e-05
langSE:directionreversed  -0.004461   0.036798 349.527802  -0.121  0.90358
                            
(Intercept)              ***
age                      ** 
langSE                      
directionreversed           
trial                    ***
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr trial 
age         -0.855                            
langSE      -0.366  0.019                     
dirctnrvrsd -0.191  0.005  0.344              
trial       -0.224 -0.007  0.007 -0.099       
lngSE:drctn  0.161 -0.006 -0.456 -0.750  0.013
Computing profile confidence intervals ...
                               2.5 %       97.5 %
.sig01                    0.05905589  0.118181815
.sig02                    0.00000000  0.041929043
.sigma                    0.18280291  0.209056680
(Intercept)               0.51668805  0.769867140
age                       0.01074604  0.054263244
langSE                   -0.04737672  0.107548455
directionreversed        -0.07674215  0.032518941
trial                    -0.01214531 -0.004263928
langSE:directionreversed -0.07630702  0.068535215
package ‘sjmisc’ was built under R version 3.6.2
Attaching package: ‘sjmisc’

The following objects are masked from ‘package:janitor’:

    remove_empty_cols, remove_empty_rows

The following object is masked from ‘package:purrr’:

    is_empty

The following object is masked from ‘package:tidyr’:

    replace_na

The following object is masked from ‘package:tibble’:

    add_case

Attaching package: ‘sjlabelled’

The following object is masked from ‘package:forcats’:

    as_factor

The following object is masked from ‘package:dplyr’:

    as_label

AOI Looking

Now we’ll re-calculate the percentages so the denominator is based on total looking time. All AOIs should sum up to 100% for each trial and each baby. Next let’s make a boxplot of all AOIs. Interesting, definitely more MidFaceBottom focus here than we had with babies, but also more distribution too.

It appears two important AOIs are MidChestTop and MidFaceBottom. Let’s look again only at midline AOIs:

I’m going to run linear models with only MidChestTop or MidFaceBottom, and see what happens. No age interactions.

MidChestTop:

  • No effect of age.
  • No effect of language.
  • Weak effect of direction (p = 0.084) - reversed means they look ~ 4.7% less at midchesttop.
  • No language X direction interaction.

MidFaceBottom:

  • No effect of age.
  • Significant effect of language (p = 0.004) - SE look at MidFaceBottom +19% more than NSE children
  • No effect of direction.
  • No language X direction interaction.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: percent ~ age + lang * direction + (1 | name) + (1 | story)
   Data: filter(kids, aoi == "MidChestTop")

REML criterion at convergence: -108

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0759 -0.6139 -0.1635  0.5257  3.4431 

Random effects:
 Groups   Name        Variance  Std.Dev.
 name     (Intercept) 0.0236542 0.15380 
 story    (Intercept) 0.0001076 0.01037 
 Residual             0.0375728 0.19384 
Number of obs: 471, groups:  name, 35; story, 8

Fixed effects:
                           Estimate Std. Error         df t value Pr(>|t|)
(Intercept)                0.332735   0.097932  33.690232   3.398  0.00176
age                       -0.004869   0.017508  32.325032  -0.278  0.78269
langSE                    -0.067047   0.058495  39.320582  -1.146  0.25864
directionreversed         -0.047327   0.027264 337.976644  -1.736  0.08350
langSE:directionreversed   0.049457   0.036436 348.971721   1.357  0.17554
                           
(Intercept)              **
age                        
langSE                     
directionreversed        . 
langSE:directionreversed   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.892                     
langSE      -0.360  0.022              
dirctnrvrsd -0.142  0.003  0.235       
lngSE:drctn  0.109 -0.004 -0.310 -0.751
Computing profile confidence intervals ...
                               2.5 %      97.5 %
.sig01                    0.11354190 0.193465409
.sig02                    0.00000000 0.042445622
.sigma                    0.18117827 0.207111281
(Intercept)               0.14404353 0.521394766
age                      -0.03861109 0.028872872
langSE                   -0.17970025 0.045555254
directionreversed        -0.10070179 0.006183759
langSE:directionreversed -0.02216830 0.120665650
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: percent ~ age + lang * direction + (1 | name) + (1 | story)
   Data: filter(kids, aoi == "MidFaceBottom")

REML criterion at convergence: 27

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.69174 -0.65300 -0.01245  0.70728  2.54595 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.025609 0.16003 
 story    (Intercept) 0.001335 0.03654 
 Residual             0.050261 0.22419 
Number of obs: 471, groups:  name, 35; story, 8

Fixed effects:
                           Estimate Std. Error         df t value Pr(>|t|)
(Intercept)                0.359105   0.104204  34.706091   3.446  0.00151
age                       -0.005517   0.018452  32.182394  -0.299  0.76685
langSE                     0.188370   0.062416  41.098544   3.018  0.00436
directionreversed         -0.005449   0.032290 418.178679  -0.169  0.86607
langSE:directionreversed  -0.049419   0.043090 421.686350  -1.147  0.25208
                           
(Intercept)              **
age                        
langSE                   **
directionreversed          
langSE:directionreversed   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.883                     
langSE      -0.361  0.021              
dirctnrvrsd -0.158  0.002  0.266       
lngSE:drctn  0.122 -0.003 -0.345 -0.762
Computing profile confidence intervals ...
                               2.5 %     97.5 %
.sig01                    0.11698914 0.20280761
.sig02                    0.00000000 0.07849412
.sigma                    0.20953296 0.23957130
(Intercept)               0.15817434 0.56034402
age                      -0.04117347 0.03009216
langSE                    0.06791089 0.30869148
directionreversed        -0.06926187 0.05753800
langSE:directionreversed -0.13345107 0.03574359

Face-Chest Ratio

Next, we’ll define a Face-Chest Ratio (FCR) such that:

  1. MidFaceCenter, MidFaceBottom = Face
  2. MidChestTop, MidChestCenter, MidChestBottom, BelowChest = Chest
  3. FCR = face - chest / face + chest

We did not include Belly or MidFaceTop because of very low looking rates according to the boxplots above.

What will a linear mixed model tell us? (with no age interactions)

  • No effect of age. Interesting. Maybe just becuase we don’t have that many babies.
  • Effect of language: SE babies have overall higher FCR than NSE babies. SE looks at the face more than the chest.
  • No effect of direction. Interesting.
  • No interaction. Interesting.
  • Strong effect of trial; FCR drops for each trial
Model failed to converge with max|grad| = 0.00286528 (tol = 0.002, component 1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: fcr ~ age + lang * direction + trial + (1 | name) + (1 | story)
   Data: kids_fcr

REML criterion at convergence: 713.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2521 -0.5495  0.0682  0.6532  2.5293 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.177164 0.42091 
 story    (Intercept) 0.006886 0.08298 
 Residual             0.208618 0.45675 
Number of obs: 471, groups:  name, 35; story, 8

Fixed effects:
                           Estimate Std. Error         df t value Pr(>|t|)
(Intercept)               1.978e-01  2.676e-01  3.520e+01   0.739   0.4648
age                      -8.416e-04  4.724e-02  3.216e+01  -0.018   0.9859
langSE                    3.542e-01  1.564e-01  3.774e+01   2.265   0.0294
directionreversed        -4.917e-03  6.630e-02  4.231e+02  -0.074   0.9409
trial                    -3.334e-02  4.920e-03  3.749e+02  -6.776  4.8e-11
langSE:directionreversed -7.607e-02  8.805e-02  4.252e+02  -0.864   0.3881
                            
(Intercept)                 
age                         
langSE                   *  
directionreversed           
trial                    ***
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr trial 
age         -0.880                            
langSE      -0.354  0.022                     
dirctnrvrsd -0.112  0.002  0.216              
trial       -0.136 -0.004  0.003 -0.099       
lngSE:drctn  0.095 -0.003 -0.281 -0.761  0.016
convergence code: 0
Model failed to converge with max|grad| = 0.00286528 (tol = 0.002, component 1)
Computing profile confidence intervals ...
                               2.5 %      97.5 %
.sig01                    0.31456663  0.52779979
.sig02                    0.02351943  0.17365834
.sigma                    0.42640716  0.48751627
(Intercept)              -0.31812715  0.71430724
age                      -0.09203664  0.09030843
langSE                    0.05255811  0.65568083
directionreversed        -0.13517230  0.12442422
trial                    -0.04301125 -0.02371043
langSE:directionreversed -0.24763561  0.09736486

“Posthoc” for SE babies only

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: fcr ~ age + direction + trial + (1 | name) + (1 | story)
   Data: filter(kids_fcr, lang == "SE")

REML criterion at convergence: 410.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.9550 -0.6020  0.1425  0.6726  2.2046 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.107258 0.32750 
 story    (Intercept) 0.005436 0.07373 
 Residual             0.221204 0.47032 
Number of obs: 264, groups:  name, 20; story, 8

Fixed effects:
                    Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)         0.586965   0.250120  20.351426   2.347   0.0292 *  
age                 0.004846   0.046634  17.964321   0.104   0.9184    
directionreversed  -0.064604   0.059033 240.859038  -1.094   0.2749    
trial              -0.042247   0.006680 206.839314  -6.324 1.55e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    drctnr
age         -0.915              
dirctnrvrsd -0.088 -0.002       
trial       -0.190 -0.009 -0.121

Visualizing Reversal Effect

I want to try to visualize reversal effects a different way. Maybe this.

Or a reversal effect chart? Okay, so this chart tells us overall there really wasn’t much of a reversal effect for SE babies, they’re all hovering around 0. Interesting. While there seems to be a reversal effect for NSE babies where they look at the face more during reversed stories!

And within-subjects variation here:

And a classic box/error plot with age collapsed.

Registering fonts with R

Heat Maps

And now heat maps!

For poster?

Note: zip::zip() is deprecated, please use zip::zipr() instead

Discussion

No big changes from the ICSLA abstract. Good!

The interpretation here is that:

  • All kids looked equally at all videos regardless of language or direction. Age did have an effect so we used age in our models. Good!
  • SE kids continue to be strong face-lookers compared to NSE kids. (Same as ICSLA)
  • There is no reversal effect. (Same as ICSLA)

That doesn’t mean both groups of children don’t care about reversal. On the contrary. We can hypothesize that SE kids have efficient gaze behavior and are resilient to reversal; while NSE kids already are “inefficient” and changing the video stimulus isn’t going to help. But how do we test that? Maybe let’s look at within-subject variation.

XY Space Data

We’ll load the data from the childxydata.feather file made in 06rawxydata.Rmd. So any new kids, please run the first code block in 06 to include it. Then we’ll keep all the kids we also have in the AOI data group.

Overall Looking

Let’s check that we have no significant group or condition differences in terms of valid (not empty) data points collected. This is same as “Global Looking” we have above, really, but w raw xy data.

Description.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: 
data_points ~ age + lang * direction + (direction | name) + (direction |  
    story)
   Data: xy_overall

REML criterion at convergence: 7516.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0133 -0.5789  0.1903  0.7322  2.2752 

Random effects:
 Groups   Name              Variance  Std.Dev. Corr 
 name     (Intercept)       1.888e+04 137.3995      
          directionreversed 1.995e-01   0.4466 0.97 
 story    (Intercept)       4.162e+04 204.0169      
          directionreversed 9.655e+03  98.2577 -0.44
 Residual                   6.768e+04 260.1538      
Number of obs: 535, groups:  name, 35; story, 8

Fixed effects:
                         Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)               524.679    117.283  28.993   4.474 0.000109 ***
age                         2.476      1.382  32.811   1.791 0.082539 .  
langSE                      4.408     57.810  32.196   0.076 0.939689    
directionreversed         -17.953     49.870  12.327  -0.360 0.724939    
langSE:directionreversed   10.149     47.247 487.388   0.215 0.830003    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.694                     
langSE      -0.269 -0.024              
dirctnrvrsd -0.296 -0.002  0.227       
lngSE:drctn  0.114  0.005 -0.405 -0.553
Computing profile confidence intervals ...
non-monotonic profile for .sig05bad spline fit for .sig05: falling back to linear interpolation
                                2.5 %      97.5 %
.sig01                     97.5119565 179.9039190
.sig02                     -1.0000000   1.0000000
.sig03                      0.0000000  48.5054545
.sig04                    121.2560632 335.9687619
.sig05                     -0.8443818   0.5708122
.sig06                     28.1071476 180.6104114
.sigma                    244.4048523 277.1006287
(Intercept)               305.0235868 745.6515276
age                        -0.1729330   5.0838822
langSE                   -105.1902957 115.6896029
directionreversed        -110.6463260  75.2664550
langSE:directionreversed  -82.8656734 102.4687275

XY Data LMMs

Now we’re going to run LMMs on babies’ raw:

  • horizontal spread (middle 50% of x data; xIQR)
  • vertical spread (middle 50% of y data; yIQR)
  • viewing area (A = middle-x * middle-y; area)

But to do this we first trim each kid’s data, getting rid of the first 60 samples (0.50 secs) of each trial.

Middle X

Description.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: xIQR ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 5145.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3266 -0.4336 -0.1667  0.1542 12.5365 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept)  61.846   7.864  
 story    (Intercept)   8.719   2.953  
 Residual             878.268  29.636  
Number of obs: 534, groups:  name, 35; story, 8

Fixed effects:
                          Estimate Std. Error        df t value Pr(>|t|)
(Intercept)               38.13628    6.85205  39.38839   5.566 2.02e-06
age                       -0.06613    0.09760  32.39698  -0.678    0.503
langSE                    -0.89305    4.55252  69.37559  -0.196    0.845
directionreversed          3.17906    3.95964 434.80176   0.803    0.422
langSE:directionreversed  -2.67056    5.25883 457.77145  -0.508    0.612
                            
(Intercept)              ***
age                         
langSE                      
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.851                     
langSE      -0.378 -0.003              
dirctnrvrsd -0.289 -0.002  0.440       
lngSE:drctn  0.214  0.007 -0.573 -0.759
Computing profile confidence intervals ...
                               2.5 %     97.5 %
.sig01                     3.5754861 11.2093528
.sig02                     0.0000000  7.2383649
.sigma                    27.8313919 31.5418940
(Intercept)               24.9210180 51.3220302
age                       -0.2546145  0.1226814
langSE                    -9.6578128  7.9002048
directionreversed         -4.5353782 10.9675126
langSE:directionreversed -13.0257923  7.5654776

Middle Y

Description.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: yIQR ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 5653.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5584 -0.5076 -0.2419  0.1108  5.9858 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept)  300.035 17.322  
 story    (Intercept)    9.853  3.139  
 Residual             2251.577 47.451  
Number of obs: 534, groups:  name, 35; story, 8

Fixed effects:
                         Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)               59.4257    12.9691  37.0247   4.582 5.08e-05 ***
age                       -0.1215     0.1887  32.7752  -0.644   0.5242    
langSE                   -10.4519     8.3316  56.6168  -1.254   0.2148    
directionreversed         10.9450     6.2897 400.4069   1.740   0.0826 .  
langSE:directionreversed -10.0349     8.3652 432.1321  -1.200   0.2310    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.870                     
langSE      -0.367  0.000              
dirctnrvrsd -0.243 -0.001  0.381       
lngSE:drctn  0.179  0.006 -0.498 -0.755
Computing profile confidence intervals ...
                               2.5 %     97.5 %
.sig01                    10.8614437 23.1060826
.sig02                     0.0000000  9.9939596
.sigma                    44.5593590 50.4957715
(Intercept)               34.4378120 84.3887649
age                       -0.4854389  0.2425792
langSE                   -26.4843811  5.5982767
directionreversed         -1.3514878 23.2682377
langSE:directionreversed -26.4541999  6.2990337

Viewing Area

Description.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: area ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 10618.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.0099 -0.2801 -0.1786 -0.0233 15.8524 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept)  1702595 1304.8  
 story    (Intercept)    31912  178.6  
 Residual             27599640 5253.5  
Number of obs: 534, groups:  name, 35; story, 8

Fixed effects:
                          Estimate Std. Error        df t value Pr(>|t|)  
(Intercept)               2605.197   1165.076    39.619   2.236    0.031 *
age                         -9.887     16.741    33.451  -0.591    0.559  
langSE                     181.489    785.881    73.046   0.231    0.818  
directionreversed          881.525    691.159   362.314   1.275    0.203  
langSE:directionreversed -1285.676    920.304   402.572  -1.397    0.163  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.859                     
langSE      -0.383 -0.003              
dirctnrvrsd -0.297 -0.001  0.442       
lngSE:drctn  0.218  0.007 -0.581 -0.752
Computing profile confidence intervals ...
Last two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepunexpected decrease in profile: using minstepunexpected decrease in profile: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepnon-monotonic profile for .sig02bad spline fit for .sig02: falling back to linear interpolationcollapsing to unique 'x' values
                               2.5 %     97.5 %
.sig01                     522.19135 1876.55263
.sig02                       0.00000        Inf
.sigma                    4936.29250 5587.86945
(Intercept)                368.63639 4849.05524
age                        -42.13398   22.39641
langSE                   -1336.66470 1688.46326
directionreversed         -478.08996 2222.87739
langSE:directionreversed -3075.97943  522.77446

XY Space Data - Multiple Plots

First let’s prep the data.

funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.
LS0tCnRpdGxlOiAiQ2hpbGRyZW4gLSBTdHVkeSAyIC0gUmVzdWx0cyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0aGVtZTogc3BhY2VsYWIKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIHRvY19mbG9hdDogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpUaGlzIGlzIHRoZSByZXN1bHRzIHNlY3Rpb24gZm9yIHRoZSBTdHVkeSAyIE5TRSAmIFNFIENISUxEUkVOIHdhdGNoaW5nIEFTTCBTdG9yaWVzLiBXZSBoYXZlIHR3byBtYWluIGZhY3RvcnM6IAoKMS4gTGFuZ3VhZ2UgKFNpZ24gdi4gRW5nbGlzaCkKMS4gRGlyZWN0aW9uIChGb3J3YXJkIHYuIFJldmVyc2VkKQoKV2UgYXJlIHRha2luZyBvdXQgb25lIG9sZGVyIEtPREEgKEV0aGFuLCAxMC41IHlycykgdG8gYmFsYW5jZSB0aGUgZ3JvdXBzIGJldHRlci4gCgojIERlbW9ncmFwaGljcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobG1lclRlc3QpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGZlYXRoZXIpCmxpYnJhcnkoR0dhbGx5KQoKa2lkcyA8LSByZWFkX2ZlYXRoZXIoImNsZWFuZWRjaGlsZGV5ZWRhdGEuZmVhdGhlciIpICU+JQojICBtdXRhdGUoYWdlID0gYWdlKjEyKSAlPiUKICBzZWxlY3QocGFydGljaXBhbnQsIGxhbmd1YWdlLCBhZ2UsIGdlbmRlciwgc3RvcnksIGRpcmVjdGlvbiwgbWFyaywgdHJpYWwsIHJlcGV0aXRpb24sIGFvaSwgc2VjcywgcGVyY2VudCkgJT4lCiAgcmVuYW1lKG5hbWUgPSBwYXJ0aWNpcGFudCkgJT4lCiAgZmlsdGVyKGFnZSA8IDkpICU+JSAjIFRha2Ugb3V0IEV0aGFuCiAgIyBtdXRhdGUoYWdlZ3JvdXAgPSBjYXNlX3doZW4oCiAgIyAgIGFnZSA8PSA4Ljk5IH4gInlvdW5nZXIiLAogICMgICBhZ2UgPj0gOS4wICYgYWdlIDwgMTUgfiAib2xkZXIiCiAgIyApKSAlPiUKICAjIGZpbHRlcighaXMubmEoYWdlZ3JvdXApKSAlPiUKICBtdXRhdGUobGFuZ3VhZ2UgPSBjYXNlX3doZW4oCiAgICBsYW5ndWFnZSA9PSAiZW5nbGlzaCIgfiAiTlNFIiwKICAgIGxhbmd1YWdlID09InNpZ24iIH4gIlNFIgogICkpICU+JQogIHJlbmFtZShsYW5nID0gbGFuZ3VhZ2UpCgpraWRzaW5mbyA8LSBraWRzICU+JQogIHNlbGVjdChuYW1lLCBsYW5nLCBhZ2UsIGdlbmRlcikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShsYW5nKSAlPiUKICBzdW1tYXJpc2UoTiA9IG4oKSwKICAgICAgICAgICAgYWdlX21lYW4gPSBtZWFuKGFnZSksCiAgICAgICAgICAgIHNkID0gc2QoYWdlKSwKICAgICAgICAgICAgbWluID0gbWluKGFnZSksCiAgICAgICAgICAgIG1heCA9IG1heChhZ2UpKQoKZ2VuZGVycyA8LSBraWRzICU+JQogIHNlbGVjdChuYW1lLCBsYW5nLCBhZ2UsIGdlbmRlcikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShsYW5nLCBnZW5kZXIpICU+JQogIHN1bW1hcmlzZShOID0gbigpKSAlPiUKICBzcHJlYWQoZ2VuZGVyLCBOKQoKa2lkc2luZm8gPC0gbGVmdF9qb2luKGtpZHNpbmZvLCBnZW5kZXJzKSAlPiUKICBzZWxlY3QobGFuZywgTiwgRmVtYWxlLCBNYWxlLCBhZ2VfbWVhbiwgc2QsIG1pbiwgbWF4KSAlPiUKICBwcmludCgpCgojIGJhYmllcyRhZ2Vncm91cCA8LSBmY3RfcmVsZXZlbChiYWJpZXMkYWdlZ3JvdXAsIGMoInlvdW5nZXIiLCJvbGRlciIpKQoKCiMgSUYgd2UgZG8gYWdlIGdyb3VwcywgdXNlIHRoaXMgY29kZQojIAojIGJhYmllc2luZm8gPC0gYmFiaWVzICU+JQojICAgc2VsZWN0KG5hbWUsIGxhbmcsIGFnZSwgYWdlZ3JvdXAsIGdlbmRlcikgJT4lCiMgICBkaXN0aW5jdCgpICU+JQojICAgZ3JvdXBfYnkobGFuZywgYWdlZ3JvdXApICU+JQojICAgc3VtbWFyaXNlKE4gPSBuKCksCiMgICAgICAgICAgICAgYWdlX21lYW4gPSBtZWFuKGFnZSksCiMgICAgICAgICAgICAgc2QgPSBzZChhZ2UpLAojICAgICAgICAgICAgIG1pbiA9IG1pbihhZ2UpLAojICAgICAgICAgICAgIG1heCA9IG1heChhZ2UpKQojIAojIGdlbmRlcnMgPC0gYmFiaWVzICU+JQojICAgc2VsZWN0KG5hbWUsIGxhbmcsIGFnZSwgYWdlZ3JvdXAsIGdlbmRlcikgJT4lCiMgICBkaXN0aW5jdCgpICU+JQojICAgZ3JvdXBfYnkobGFuZywgYWdlZ3JvdXAsIGdlbmRlcikgJT4lCiMgICBzdW1tYXJpc2UoTiA9IG4oKSkgJT4lCiMgICBzcHJlYWQoZ2VuZGVyLCBOKQojIAojIGJhYmllc2luZm8gPC0gbGVmdF9qb2luKGJhYmllc2luZm8sIGdlbmRlcnMpICU+JQojICAgc2VsZWN0KGxhbmcsIGFnZWdyb3VwLCBOLCBGZW1hbGUsIE1hbGUsIGFnZV9tZWFuLCBzZCwgbWluLCBtYXgpICU+JQojICAgcHJpbnQoKQpgYGAKCkxldCdzIHBsb3QgdGhlIGFnZXMsIGFuZCBjaGVjayBpZiB0aGVyZSBpcyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGFnZXMgYmV0d2VlbiB0aGUgdHdvIGdyb3Vwcz8KCmBgYHtyfQojIEJveHBsb3QKa2lkcyAlPiUKICBzZWxlY3QobmFtZSwgYWdlLCBsYW5nKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBhZ2UsIGZpbGwgPSBsYW5nKSkgKyBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKCmtpZHMgJT4lCiAgc2VsZWN0KG5hbWUsIGFnZSwgbGFuZykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIGZpbGwgPSBsYW5nKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfZ3JpZChsYW5nIH4gLikKCgojIFQtdGVzdApuc2VfYWdlIDwtIGtpZHMgJT4lIGZpbHRlcihsYW5nID09ICJOU0UiKSAlPiUgc2VsZWN0KG5hbWUsIGFnZSkgJT4lIGRpc3RpbmN0KCkKc2VfYWdlIDwtIGtpZHMgJT4lIGZpbHRlcihsYW5nID09ICJTRSIpICU+JSBzZWxlY3QobmFtZSwgYWdlKSAlPiUgZGlzdGluY3QoKQp0LnRlc3QobnNlX2FnZSRhZ2UsIHNlX2FnZSRhZ2UpCmBgYAoKCiMgR2xvYmFsIExvb2tpbmcKCkZvciBjaGlsZHJlbiwgd2UgY2FsY3VsYXRlZCBwZXJjZW50YWdlcyAqYmFzZWQgb24gb3ZlcmFsbCBjbGlwIGxlbmd0aCogYXMgdGhlIGRlbm9taW5hdG9yLiBJbiB0aGlzIHdheSwgd2UgY2FuIG1lYW5pbmdmdWxseSBjb250cmFzdCBsb29raW5nIHRpbWVzIGF0IHRoZSB2aWRlb3MgKHdoaWNoIGFyZSB2YXJpYWJsZSBsZW5ndGhzKSBiYXNlZCBvbiBkaWZmZXJlbnQgZmFjdG9ycy4gQnV0IHdoZW4gd2UgZ28gdG8gQU9JIGFuYWx5c2lzIHdlIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlcyBzbyB0aGUgZGVub21pbmF0b3IgaXMgYmFzZWQgb24gdG90YWwgbG9va2luZyB0aW1lLCBub3Qgb3ZlcmFsbCBjbGlwIGxlbmd0aC4gCgpUaGUgY2hhcnQgYmVsb3cgc2hvd3MgdGhlcmUgc2VlbXMgdG8gYmUgYW4gZWZmZWN0IG9mIGFnZTsgb2xkZXIga2lkcyBsb29rIGxvbmdlciBhdCBpdCB0aGFuIHlvdW5nZXIga2lkcy4gTWF5YmUgbm90IHRvbyBzdXJwcmlzaW5nLiBJdCBtZWFucyB3ZSBuZWVkIHRvIGtlZXAgYWdlIGluIGFueSBtb2RlbHMgd2UgcnVuLiBMZXQncyBhbmFseXplIGEgYml0IG1vcmUgYmVsb3cuCgpgYGB7cn0Ka2lkcyRsYW5nIDwtIGFzLmZhY3RvcihraWRzJGxhbmcpCmtpZHNfb3ZlcmFsbF9sb29raW5nIDwtIGtpZHMgJT4lCiAgZ3JvdXBfYnkobmFtZSwgYWdlLCBsYW5nLCBkaXJlY3Rpb24sIHN0b3J5LCB0cmlhbCkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBzdW0ocGVyY2VudCkpICMgZ2V0cyB0b3RhbCBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggdHJpYWwgZm9yIGVhY2gga2lkCgojIFRhYmxlIG9mIG1lYW5zCmtpZHNfb3ZlcmFsbF9sb29raW5nICU+JSAKICBncm91cF9ieShuYW1lLCBsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShwZXJjZW50ID0gbWVhbihwZXJjZW50KSkgJT4lICMgZ2V0IGF2ZXJhZ2UgbG9va2luZyBwZXJjZW50IGZvciBlYWNoIGtpZAogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fcGVyY2VudCA9IG1lYW4ocGVyY2VudCksCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZCA9IHNkKHBlcmNlbnQpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgpnZ3Bsb3Qoa2lkc19vdmVyYWxsX2xvb2tpbmcsIGFlcyh4ID0gYWdlLCB5ID0gcGVyY2VudCwgY29sb3IgPSBkaXJlY3Rpb24sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gMC41KSArCiAgZmFjZXRfZ3JpZCguIH4gbGFuZykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSkgKwogIGdndGl0bGUoIlZpZGVvIEF0dGVudGlvbiIpICsKICB4bGFiKCJhZ2UgKG1vbnRocykiKSArCiAgeWxhYigicGVyY2VudCBsb29raW5nIikgKyAKICB0aGVtZV9idygpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gcGVyY2VudCkgCgoKIyBQbG90CiMgYmFiaWVzX292ZXJhbGxfbG9va2luZyAlPiUgCiMgICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIG5hbWUpICU+JQojICAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQpKSAlPiUgIyBnZXRzIGF2ZXJhZ2UgbG9va2luZyBwZXJjZW50IGZvciBlYWNoIGJhYnkKIyAgIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiMgICBzdW1tYXJpc2UobWVhbl9wZXJjZW50ID0gbWVhbihwZXJjZW50KSwgIyBnZXRzIGdyb3VwIGF2ZXJhZ2VzCiMgICAgICAgICAgICAgY291bnQgPSBuKCksCiMgICAgICAgICAgICAgc2QgPSBzZChwZXJjZW50KSwKIyAgICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUgCiMgICBnZ3Bsb3QoYWVzKHggPSBsYW5nLCB5ID0gbWVhbl9wZXJjZW50LCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3BlcmNlbnQgLSBzZSwgeW1heCA9IG1lYW5fcGVyY2VudCArIHNlKSwgCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB3aWR0aCA9IDAuMjUpICsgCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBwZXJjZW50KSArCiMgICB0aGVtZV9taW5pbWFsKCkgKyAKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICMgIGZhY2V0X3dyYXAoImxhbmciKSArCiMgICBnZ3RpdGxlKCJWaWRlbyBBdHRlbnRpb24iKSArCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJwZXJjZW50IGxvb2tpbmciKQoKIyBiYWJpZXNfb3ZlcmFsbF9sb29raW5nICU+JQojICAgZ2dwbG90KGFlcyh4ID0gbGFuZywgeSA9IHBlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArCiMgICBmYWNldF93cmFwKCJhZ2Vncm91cCIpICsgCiMgICBnZW9tX3Zpb2xpbigpCmBgYAoKQSBsaW5lYXIgbW9kZWwgc2hvd3MgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgYWdlLiBPdmVyYWxsLCBBZ2Ugc2VlbXMgdG8gaW5jcmVhc2Ugb3ZlcmFsbCBsb29raW5nIGJ5IGFib3V0IDMlIGV2ZXJ5IHllYXIuIEhvd2V2ZXIsIHRoZXJlIGFyZSBubyBkaWZmZXJlbmNlcyBiZXR3ZWVuIE5TRSB2LiBTRSwgb3IgcmV2ZXJzYWwsIG9uIGhvdyBsb25nIHRoZXkgbG9va2VkLCBzbyB0aGF0J3MgZ29vZC4gCgpgYGB7cn0KZ2xvYmFsX2xtIDwtIGxtZXIocGVyY2VudCB+IGFnZSArIGxhbmcgKiBkaXJlY3Rpb24gKyB0cmlhbCArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0ga2lkc19vdmVyYWxsX2xvb2tpbmcpCnN1bW1hcnkoZ2xvYmFsX2xtKQpjb25maW50KGdsb2JhbF9sbSkKI2dnY29lZihnbG9iYWxfbG0pCgpsaWJyYXJ5KHNqUGxvdCkKbGlicmFyeShzam1pc2MpCmxpYnJhcnkoc2psYWJlbGxlZCkKCnRhYl9tb2RlbChnbG9iYWxfbG0sIHNob3cuc2UgPSBULCBzaG93LnN0YXQgPSBUKQpgYGAKCiMgQU9JIExvb2tpbmcKTm93IHdlJ2xsIHJlLWNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZXMgc28gdGhlIGRlbm9taW5hdG9yIGlzIGJhc2VkIG9uIHRvdGFsIGxvb2tpbmcgdGltZS4gQWxsIEFPSXMgc2hvdWxkIHN1bSB1cCB0byAxMDAlIGZvciBlYWNoIHRyaWFsIGFuZCBlYWNoIGJhYnkuIE5leHQgbGV0J3MgbWFrZSBhIGJveHBsb3Qgb2YgYWxsIEFPSXMuIEludGVyZXN0aW5nLCBkZWZpbml0ZWx5IG1vcmUgTWlkRmFjZUJvdHRvbSBmb2N1cyBoZXJlIHRoYW4gd2UgaGFkIHdpdGggYmFiaWVzLCBidXQgYWxzbyBtb3JlIGRpc3RyaWJ1dGlvbiB0b28uCgpgYGB7cn0KIyBSZWNhbGN1bGF0ZSBwZXJjZW50CmtpZHMgPC0ga2lkcyAlPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCgtcGVyY2VudCkgJT4lCiAgZ3JvdXBfYnkobmFtZSwgbGFuZywgYWdlLCBkaXJlY3Rpb24sIHN0b3J5LCBtYXJrLCB0cmlhbCwgcmVwZXRpdGlvbiwgZ2VuZGVyKSAlPiUKICBtdXRhdGUodG90YWxzZWMgPSBzdW0oc2VjcykpICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGFnZSwgZGlyZWN0aW9uLCBzdG9yeSwgbWFyaywgdHJpYWwsIHJlcGV0aXRpb24sIGdlbmRlciwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IHNlY3MvdG90YWxzZWMpCgojIEJveHBsb3QKa2lkcyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhb2ksIHkgPSBwZXJjZW50LCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKSArCiAgZ2d0aXRsZSgiQU9JIEF0dGVudGlvbiIpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoMCwxKSkKYGBgCkl0IGFwcGVhcnMgdHdvIGltcG9ydGFudCBBT0lzIGFyZSBNaWRDaGVzdFRvcCBhbmQgTWlkRmFjZUJvdHRvbS4gTGV0J3MgbG9vayBhZ2FpbiBvbmx5IGF0IG1pZGxpbmUgQU9JczoKCmBgYHtyfQptaWRsaW5lID0gYygiQmVsbHkiLCJCZWxvd0NoZXN0IiwiTWlkQ2hlc3RCb3R0b20iLCJNaWRDaGVzdENlbnRlciIsIk1pZENoZXN0VG9wIiwKICAgICAgICAgICAgIk1pZEZhY2VCb3R0b20iLCJNaWRGYWNlQ2VudGVyIiwiTWlkRmFjZVRvcCIpCmtpZHMgJT4lCiAgZmlsdGVyKGFvaSAlaW4lIG1pZGxpbmUpICU+JQogIGdncGxvdChhZXMoeCA9IGFvaSwgeSA9IHBlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21fYm94cGxvdCgpICsKICBnZ3RpdGxlKCJNaWRsaW5lIEFPSSBBdHRlbnRpb24iKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKDAsMSkpCmBgYAoKSSdtIGdvaW5nIHRvIHJ1biBsaW5lYXIgbW9kZWxzIHdpdGggb25seSBNaWRDaGVzdFRvcCBvciBNaWRGYWNlQm90dG9tLCBhbmQgc2VlIHdoYXQgaGFwcGVucy4gTm8gYWdlIGludGVyYWN0aW9ucy4KCioqTWlkQ2hlc3RUb3A6KioKCiogTm8gZWZmZWN0IG9mIGFnZS4KKiBObyBlZmZlY3Qgb2YgbGFuZ3VhZ2UuCiogKldlYWsqIGVmZmVjdCBvZiBkaXJlY3Rpb24gKHAgPSAwLjA4NCkgLSByZXZlcnNlZCBtZWFucyB0aGV5IGxvb2sgfiA0LjclIGxlc3MgYXQgbWlkY2hlc3R0b3AuCiogTm8gbGFuZ3VhZ2UgWCBkaXJlY3Rpb24gaW50ZXJhY3Rpb24uIAoKCioqTWlkRmFjZUJvdHRvbToqKiAKCiogTm8gZWZmZWN0IG9mIGFnZS4KKiBTaWduaWZpY2FudCBlZmZlY3Qgb2YgbGFuZ3VhZ2UgKHAgPSAwLjAwNCkgLSBTRSBsb29rIGF0IE1pZEZhY2VCb3R0b20gKzE5JSBtb3JlIHRoYW4gTlNFIGNoaWxkcmVuCiogTm8gZWZmZWN0IG9mIGRpcmVjdGlvbi4KKiBObyBsYW5ndWFnZSBYIGRpcmVjdGlvbiBpbnRlcmFjdGlvbi4KCgpgYGB7cn0Ka2lkcyAlPiUKICBmaWx0ZXIoYW9pICVpbiUgYygiTWlkRmFjZUJvdHRvbSIsIk1pZENoZXN0VG9wIikpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IHBlcmNlbnQsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gcGVyY2VudCkgKwogIHRoZW1lX2J3KCkgKyAKIyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZmFjZXRfZ3JpZChhb2kgfiBsYW5nKSArCiAgZ2d0aXRsZSgiQU9JIEF0dGVudGlvbiIpICsKICB4bGFiKCIiKSArCiAgeWxhYigicGVyY2VudCBsb29raW5nIikKCm1pZGNoZXN0dG9wX2xtIDwtIGxtZXIocGVyY2VudCB+IGFnZSArIGxhbmcgKiBkaXJlY3Rpb24gKyAoMXxuYW1lKSArICgxfHN0b3J5KSwgZGF0YSA9IGZpbHRlcihraWRzLCBhb2kgPT0gIk1pZENoZXN0VG9wIikpCnN1bW1hcnkobWlkY2hlc3R0b3BfbG0pCmNvbmZpbnQobWlkY2hlc3R0b3BfbG0pCiNnZ2NvZWYobWlkY2hlc3R0b3BfbG0pCgptaWRmYWNlYm90dG9tX2xtIDwtIGxtZXIocGVyY2VudCB+IGFnZSArIGxhbmcgKiBkaXJlY3Rpb24gKyAoMXxuYW1lKSArICgxfHN0b3J5KSwgZGF0YSA9IGZpbHRlcihraWRzLCBhb2kgPT0gIk1pZEZhY2VCb3R0b20iKSkKc3VtbWFyeShtaWRmYWNlYm90dG9tX2xtKQpjb25maW50KG1pZGZhY2Vib3R0b21fbG0pCiNnZ2NvZWYobWlkZmFjZWJvdHRvbV9sbSkKCiMgQmFyIGNoYXJ0CiMgYmFiaWVzICU+JQojICAgZmlsdGVyKGFvaSAlaW4lIGMoIk1pZEZhY2VCb3R0b20iLCJNaWRDaGVzdFRvcCIpKSAlPiUKIyAgIGdyb3VwX2J5KGFnZWdyb3VwLCBsYW5nLCBkaXJlY3Rpb24sIG5hbWUsIGFvaSkgJT4lCiMgICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCkpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQojICAgZ3JvdXBfYnkoYWdlZ3JvdXAsIGxhbmcsIGRpcmVjdGlvbiwgYW9pKSAlPiUKIyAgIHN1bW1hcmlzZShtZWFuX3BlcmNlbnQgPSBtZWFuKHBlcmNlbnQpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKIyAgICAgICAgICAgICBjb3VudCA9IG4oKSwKIyAgICAgICAgICAgICBzZCA9IHNkKHBlcmNlbnQpLAojICAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBtZWFuX3BlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fcGVyY2VudCAtIHNlLCB5bWF4ID0gbWVhbl9wZXJjZW50ICsgc2UpLCAKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHdpZHRoID0gMC4yNSkgKyAKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHBlcmNlbnQpICsKIyAgIHRoZW1lX21pbmltYWwoKSArIAojICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiMgICBmYWNldF9ncmlkKGFvaSB+IGFnZWdyb3VwKSArCiMgICBnZ3RpdGxlKCJWaWRlbyBBdHRlbnRpb24iKSArCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJwZXJjZW50IGxvb2tpbmciKQpgYGAKCgojIEZhY2UtQ2hlc3QgUmF0aW8KTmV4dCwgd2UnbGwgZGVmaW5lIGEgRmFjZS1DaGVzdCBSYXRpbyAoRkNSKSBzdWNoIHRoYXQ6CgoxLiBNaWRGYWNlQ2VudGVyLCBNaWRGYWNlQm90dG9tID0gRmFjZQoxLiBNaWRDaGVzdFRvcCwgTWlkQ2hlc3RDZW50ZXIsIE1pZENoZXN0Qm90dG9tLCBCZWxvd0NoZXN0ID0gQ2hlc3QKMS4gRkNSID0gZmFjZSAtIGNoZXN0IC8gZmFjZSArIGNoZXN0CgpXZSBkaWQgbm90IGluY2x1ZGUgQmVsbHkgb3IgTWlkRmFjZVRvcCBiZWNhdXNlIG9mIHZlcnkgbG93IGxvb2tpbmcgcmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBib3hwbG90cyBhYm92ZS4KCmBgYHtyfQpraWRzX2ZjciA8LSBraWRzICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoYW9pLHBlcmNlbnQpICU+JQogIGdyb3VwX2J5KG5hbWUsIGFnZSwgbGFuZywgZ2VuZGVyLCBkaXJlY3Rpb24sIHN0b3J5LCB0cmlhbCkgJT4lCiAgc3VtbWFyaXNlKGZhY2UgPSBzdW0oTWlkRmFjZUNlbnRlciwgTWlkRmFjZUJvdHRvbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgY2hlc3QgPSBzdW0oTWlkQ2hlc3RUb3AsIE1pZENoZXN0Q2VudGVyLCBNaWRDaGVzdEJvdHRvbSwgQmVsb3dDaGVzdCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgZmNyID0gKGZhY2UgLSBjaGVzdCkgLyAoZmFjZSArIGNoZXN0KSkKCiMgVGFibGUgb2YgbWVhbnMKa2lkc19mY3IgJT4lIAogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbiwgbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbl9mY3IgPSBtZWFuKGZjciksICMgZ2V0cyBncm91cCBhdmVyYWdlcwogICAgICAgICAgICBjb3VudCA9IG4oKSwKICAgICAgICAgICAgc2QgPSBzZChmY3IpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgpraWRzX2ZjciAlPiUgCiAgZ3JvdXBfYnkobGFuZywgbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZykgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZmNyID0gbWVhbihmY3IpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkgJT4lCiAgc2VsZWN0KC1zZCkgJT4lCiAgcHJpbnQoKQoKIyBQbG90CmdncGxvdChraWRzX2ZjciwgYWVzKHggPSBhZ2UsIHkgPSBmY3IsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEpKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsKICBnZ3RpdGxlKCJGYWNlLUNoZXN0IFJhdGlvcyIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRkNSIikKCiMgQmFyIGNoYXJ0CiMgYmFiaWVzX2ZjciAlPiUgCiMgICBncm91cF9ieShhZ2Vncm91cCwgbGFuZywgZGlyZWN0aW9uLCBuYW1lKSAlPiUKIyAgIHN1bW1hcmlzZShmY3IgPSBtZWFuKGZjcikpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQojICAgZ3JvdXBfYnkoYWdlZ3JvdXAsIGxhbmcsIGRpcmVjdGlvbikgJT4lCiMgICBzdW1tYXJpc2UobWVhbl9mY3IgPSBtZWFuKGZjciksICMgZ2V0cyBncm91cCBhdmVyYWdlcwojICAgICAgICAgICAgIGNvdW50ID0gbigpLAojICAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKIyAgICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUgCiMgICBnZ3Bsb3QoYWVzKHggPSBsYW5nLCB5ID0gbWVhbl9mY3IsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fZmNyIC0gc2UsIHltYXggPSBtZWFuX2ZjciArIHNlKSwgCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB3aWR0aCA9IDAuMjUpICsgCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxKSkgKwojICAgdGhlbWVfbWluaW1hbCgpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIGZhY2V0X3dyYXAoImFnZWdyb3VwIikgKwojICAgZ2d0aXRsZSgiRmFjZS1DaGVzdCBSYXRpb3MiKSArCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJGQ1IiKQpgYGAKCldoYXQgd2lsbCBhIGxpbmVhciBtaXhlZCBtb2RlbCB0ZWxsIHVzPyAod2l0aCBubyBhZ2UgaW50ZXJhY3Rpb25zKQoKKiBObyBlZmZlY3Qgb2YgYWdlLiBJbnRlcmVzdGluZy4gTWF5YmUganVzdCBiZWN1YXNlIHdlIGRvbid0IGhhdmUgdGhhdCBtYW55IGJhYmllcy4gCiogRWZmZWN0IG9mIGxhbmd1YWdlOiBTRSBiYWJpZXMgaGF2ZSBvdmVyYWxsIGhpZ2hlciBGQ1IgdGhhbiBOU0UgYmFiaWVzLiBTRSBsb29rcyBhdCB0aGUgZmFjZSBtb3JlIHRoYW4gdGhlIGNoZXN0LiAKKiBObyBlZmZlY3Qgb2YgZGlyZWN0aW9uLiBJbnRlcmVzdGluZy4gCiogTm8gaW50ZXJhY3Rpb24uIEludGVyZXN0aW5nLiAKKiBTdHJvbmcgZWZmZWN0IG9mIHRyaWFsOyBGQ1IgZHJvcHMgZm9yIGVhY2ggdHJpYWwKCmBgYHtyfQpmY3JfbG0gPC0gbG1lcihmY3IgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgdHJpYWwgKyAoMXxuYW1lKSArICgxfHN0b3J5KSwgZGF0YSA9IGtpZHNfZmNyKQpzdW1tYXJ5KGZjcl9sbSkKY29uZmludChmY3JfbG0pCiNnZ2NvZWYoZmNyX2xtKQoKd3JpdGVfY3N2KGtpZHNfZmNyLCAiZmNyX3RyaWFsX2xldmVsX3ZhbHVlc19jaGlsZHJlbi5jc3YiKQoKdGFiX21vZGVsKGZjcl9sbSwgc2hvdy5zZSA9IFQsIHNob3cuc3RhdCA9IFQpCmBgYAoKIyMgIlBvc3Rob2MiIGZvciBTRSBiYWJpZXMgb25seSAKYGBge3J9Cgpwb3N0X2hvYyA8LSBsbWVyKGZjciB+IGFnZSArIGRpcmVjdGlvbiArIHRyaWFsICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIAogICAgICAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXIoa2lkc19mY3IsIGxhbmcgPT0gJ1NFJykpCnN1bW1hcnkocG9zdF9ob2MpCmBgYAoKCiMgVGhlIExhcmdlIFRhYmxlCgo+IEkgd291bGQgbGlrZSBhIGxhcmdlIHRhYmxlIHdpdGggYWxsIGluZGl2aWR1YWwgcGVyY2VudCBsb29raW5nIG1lYW5zIGZvciBlYWNoIEFPSSBhbmQgdGhlIGluZGl2aWR1YWwgRkNSIHZhbHVlcywgd2l0aCBhZ2VzLCBnZW5kZXIsIHZpZGVvIGdyb3VwIGZvciBlYWNoIGNoaWxkLiAgKGNvbGxhcHNlZCBhY3Jvc3Mgc3RvcmllcyBhbmQgdHJpYWxzKSAgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIENvbGxhcHNlIGFjcm9zcyBzdG9yaWVzIGFuZCB0cmlhbHMgCgpraWRzX3NwcmVhZCA8LSBraWRzICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGFnZSwgZ2VuZGVyLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVCkpICU+JQogIHNwcmVhZChhb2ksIHBlcmNlbnQpCgpraWRzX2Zjcl9zcHJlYWQgPC0ga2lkc19mY3IgJT4lCiAgZ3JvdXBfYnkobmFtZSwgbGFuZywgYWdlLCBnZW5kZXIsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyLCBuYS5ybSA9IFQpKQoKa2lkc19sYXJnZV90YWJsZSA8LSBraWRzX3NwcmVhZCAlPiUKICBsZWZ0X2pvaW4oa2lkc19mY3Jfc3ByZWFkKQoKa2lkc19sYXJnZV90YWJsZSAlPiUKICB3cml0ZV9jc3YoImxhcmdlX3RhYmxlX2tpZHMuY3N2IikKYGBgCgoKIyBWaXN1YWxpemluZyBSZXZlcnNhbCBFZmZlY3QKSSB3YW50IHRvIHRyeSB0byB2aXN1YWxpemUgcmV2ZXJzYWwgZWZmZWN0cyBhIGRpZmZlcmVudCB3YXkuIE1heWJlIHRoaXMuIAoKYGBge3J9CiMgR2V0IHBhcnRpY2lwYW50LWxldmVsIGRhdGEKa2lkc19mY3IyIDwtIGtpZHNfZmNyICU+JQogIGdyb3VwX2J5KG5hbWUsIGFnZSwgbGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZmNyID0gbWVhbihmY3IpKQoKIyByZXZlcnNhbF9lZmZlY3RfbG0gPC0gbG1lcihmY3IgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSksIGRhdGEgPSBraWRzX2ZjcjIpCiMgc3VtbWFyeShyZXZlcnNhbF9lZmZlY3RfbG0pCgpnZ3Bsb3Qoa2lkc19mY3IyLCBhZXMoeCA9IGRpcmVjdGlvbiwgeSA9IGZjciwgY29sb3IgPSBsYW5nLCBmaWxsID0gbGFuZykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBuYW1lKSkgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMSkpICsKICB0aGVtZV9idygpCgpgYGAKCk9yIGEgcmV2ZXJzYWwgZWZmZWN0IGNoYXJ0PyBPa2F5LCBzbyB0aGlzIGNoYXJ0IHRlbGxzIHVzIG92ZXJhbGwgdGhlcmUgcmVhbGx5IHdhc24ndCBtdWNoIG9mIGEgcmV2ZXJzYWwgZWZmZWN0IGZvciBTRSBiYWJpZXMsIHRoZXkncmUgYWxsIGhvdmVyaW5nIGFyb3VuZCAwLiBJbnRlcmVzdGluZy4gV2hpbGUgdGhlcmUgc2VlbXMgdG8gYmUgYSByZXZlcnNhbCBlZmZlY3QgZm9yIE5TRSBiYWJpZXMgd2hlcmUgdGhleSBsb29rIGF0IHRoZSBmYWNlIG1vcmUgZHVyaW5nIHJldmVyc2VkIHN0b3JpZXMhIAoKYGBge3J9CiMgR2V0IHBhcnRpY2lwYW50LWxldmVsIGRhdGEKa2lkc19mY3IzIDwtIGtpZHNfZmNyMiAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBmY3IpICU+JQogIGdyb3VwX2J5KG5hbWUsIGFnZSwgbGFuZykgJT4lCiAgbXV0YXRlKGRpZmYgPSBmb3J3YXJkIC0gcmV2ZXJzZWQpCgpnZ3Bsb3Qoa2lkc19mY3IzLCBhZXMoeCA9IGFnZSwgeSA9IGRpZmYsIGNvbG9yID0gbGFuZykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIlJldmVyc2FsIEVmZmVjdCIpICsKICB5bGFiKCJGb3J3YXJkIEZDUiAtIFJldmVyc2VkIEZDUiIpCmBgYAoKQW5kIHdpdGhpbi1zdWJqZWN0cyB2YXJpYXRpb24gaGVyZTogCgpgYGB7cn0KIyBGaXJzdCBnZXQgdGhlIG1lYW4gb2YgZWFjaCB0cmlhbCwgVEhFTiB0aGUgcGFydGljaXBhbnQtbGV2ZWwgbWVhbnMKd2l0aGluX3N1YmplY3RzIDwtIGtpZHNfZmNyICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGRpcmVjdGlvbiwgc3RvcnksIHRyaWFsKSAlPiUKICBzdW1tYXJpc2UoZmNyID0gbWVhbihmY3IsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50ID0gbigpKSAlPiUKICBncm91cF9ieShuYW1lLCBsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihmY3IsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNlID0gc2QoZmNyLCBuYS5ybSA9IFRSVUUpL3NxcnQobigpKSwKICAgICAgICAgICAgY291bnQgPSBuKCkpCiMgVGhlbiBzcHJlYWQgb3V0IG1lYW4gYW5kIFNFIGNvbHVtbnMgYnkgZGlyZWN0aW9uCndpdGhpbl9zdWJqZWN0c19tZWFucyA8LSB3aXRoaW5fc3ViamVjdHMgJT4lCiAgc2VsZWN0KC1zZSwgLWNvdW50KSAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBtZWFuLCBzZXAgPSAiXyIpCndpdGhpbl9zdWJqZWN0c19zZSA8LSB3aXRoaW5fc3ViamVjdHMgJT4lCiAgc2VsZWN0KC1tZWFuLCAtY291bnQpICU+JQogIHNwcmVhZChkaXJlY3Rpb24sIHNlLCBzZXAgPSAiU0UiKQp3aXRoaW5fc3ViamVjdHMgPC0gbGVmdF9qb2luKHdpdGhpbl9zdWJqZWN0c19tZWFucywgd2l0aGluX3N1YmplY3RzX3NlLCBieSA9IGMoIm5hbWUiLCJsYW5nIikpCgojIE5vdyBsZXQncyBwbG90CmxpbXMgPC0gYygtMSwxKQp3aXRoaW5fc3ViamVjdHMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGlyZWN0aW9uX2ZvcndhcmQsIHkgPSBkaXJlY3Rpb25fcmV2ZXJzZWQsIGNvbG9yID0gbGFuZykpICsKICAgIGdlb21fYWJsaW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kaXJlY3Rpb25fcmV2ZXJzZWQtZGlyZWN0aW9uU0VyZXZlcnNlZCwgeW1heD1kaXJlY3Rpb25fcmV2ZXJzZWQrZGlyZWN0aW9uU0VyZXZlcnNlZCkpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbj1kaXJlY3Rpb25fZm9yd2FyZC1kaXJlY3Rpb25TRWZvcndhcmQsIHhtYXg9ZGlyZWN0aW9uX2ZvcndhcmQrZGlyZWN0aW9uU0Vmb3J3YXJkKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoImZvcndhcmQiLCBsaW1pdHMgPSBjKC0xLDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJyZXZlcnNlZCIsIGxpbWl0cyA9IGMoLTEsMSkpICsKICBnZ3RpdGxlKCJGQ1IgTWVhbnMiKSArCiAgZmFjZXRfd3JhcCgibGFuZyIpCmBgYAoKQW5kIGEgY2xhc3NpYyBib3gvZXJyb3IgcGxvdCB3aXRoIGFnZSBjb2xsYXBzZWQuIAoKYGBge3J9CmtpZHNfZmNyMiAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShmY3JfbWVhbiA9IG1lYW4oZmNyKSwKICAgICAgICAgICAgc2QgPSBzZChmY3IpLAogICAgICAgICAgICBuID0gbigpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpICU+JQogIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBmY3JfbWVhbiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBmY3JfbWVhbi1zZSwgeW1heCA9IGZjcl9tZWFuK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuMikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjUsIDAuNSkpICsKICB0aGVtZV9saW5lZHJhdygpCgpgYGAKCmBgYHtyIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9Nn0KCmxpYnJhcnkoZXh0cmFmb250KQoKIyBGb3IgbWFraW5nIHRoZSBiYWJpZXMvYWR1bHRzIGNoYXJ0czogCmtpZHNfZmNyMiAlPiUKICAgIGFkZF9jb2x1bW4oZ3JvdXAgPSAnY2hpbGRyZW4nKSAlPiUKICAgIHdyaXRlX2NzdigiZmNyX2luZGl2aWR1YWxfdmFsdWVzX2NoaWxkcmVuLmNzdiIpCgpraWRzX2ZjcjIgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZmNyX21lYW4gPSBtZWFuKGZjciksCiAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKICAgICAgICAgICAgbiA9IG4oKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KG4pKSAlPiUKICBhZGRfY29sdW1uKGdyb3VwID0gJ2NoaWxkcmVuJykgJT4lCiAgd3JpdGVfY3N2KCJmY3JfY2hhcnRfY2hpbGRyZW4uY3N2IikKCgpraWRzX2ZjcjIgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZmNyX21lYW4gPSBtZWFuKGZjciksCiAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKICAgICAgICAgICAgbiA9IG4oKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsYW5nLCB5ID0gZmNyX21lYW4sIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uLCBncm91cCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMC41KSArCiAgZ2VvbV9wb2ludChzaXplID0gNiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZmNyX21lYW4tc2UsIHltYXggPSBmY3JfbWVhbitzZSksIAogICAgICAgICAgICAgICAgc2l6ZSA9IDIsIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuNSwgMC41KSkgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChzaXplID0gMiksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBjb2xvciA9ICJsaWdodCBncmF5IiwgbGluZXR5cGUgPSAiZGFzaGVkIikpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSwgZmlsbCA9IEZBTFNFKQoKYGBgCgojIEhlYXQgTWFwcwpBbmQgbm93IGhlYXQgbWFwcyEKCmBgYHtyfQpoZWF0bWFwX2tpZHMgPC0ga2lkcyAlPiUKICBmaWx0ZXIoYW9pICVpbiUgbWlkbGluZSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KGxhbmcsIG5hbWUsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW9pID0gZmFjdG9yKGFvaSwgbGV2ZWxzID0gYygiQmVsbHkiLCJCZWxvd0NoZXN0IiwiTWlkQ2hlc3RCb3R0b20iLCJNaWRDaGVzdENlbnRlciIsIk1pZENoZXN0VG9wIiwKICAgICAgICAgICAgIk1pZEZhY2VCb3R0b20iLCJNaWRGYWNlQ2VudGVyIiwiTWlkRmFjZVRvcCIpKSkKCmdncGxvdChoZWF0bWFwX2tpZHMsIGFlcyh4ID0gbGFuZywgeSA9IGFvaSkpICsKICBnZW9tX3RpbGUoYWVzKGZpbGw9cGVyY2VudCksY29sb3I9ImxpZ2h0Z3JheSIsbmEucm09VFJVRSkgKyAKIyAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJ2aXJpZGlzIiwgZGlyZWN0aW9uPS0xLCBsaW1pdHMgPSBjKDAsLjcpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNmZmZmZmYiLCBoaWdoID0gIiMwODUxOWMiLCBzcGFjZSA9ICJMYWIiLCBsaW1pdHMgPSBjKDAsLjUyKSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiLCBuYS52YWx1ZSA9ICJncmV5NTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLCAKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIikpICsKICBmYWNldF9ncmlkKC4gfiBkaXJlY3Rpb24pICsKICB5bGFiKCIiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiRXllIEdhemUgSGVhdCBNYXAsIGJ5IERpcmVjdGlvbiIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCgpnZ3Bsb3QoaGVhdG1hcF9raWRzLCBhZXMoeCA9IGRpcmVjdGlvbiwgeSA9IGFvaSkpICsKICBnZW9tX3RpbGUoYWVzKGZpbGw9cGVyY2VudCksY29sb3I9ImxpZ2h0Z3JheSIsbmEucm09VFJVRSkgKyAKIyAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJ2aXJpZGlzIiwgZGlyZWN0aW9uPS0xLCBsaW1pdHMgPSBjKDAsLjcpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNmZmZmZmYiLCBoaWdoID0gIiMwODUxOWMiLCBzcGFjZSA9ICJMYWIiLCBsaW1pdHMgPSBjKDAsLjUyKSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiLCBuYS52YWx1ZSA9ICJncmV5NTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLCAKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIikpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIkV5ZSBHYXplIEhlYXQgTWFwLCBieSBMYW5ndWFnZSIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCmBgYAoKCiMjIENvbGxhcGVkIGJ5IGRpcmVjdGlvbiAobmV3KQpgYGB7cn0KaGVhdG1hcF9raWRzMiA8LSBraWRzICU+JQogIGZpbHRlcihhb2kgJWluJSBtaWRsaW5lKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkobGFuZywgbmFtZSwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIGdyb3VwX2J5KGxhbmcsIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGFvaSA9IGZhY3Rvcihhb2ksIGxldmVscyA9IGMoIkJlbGx5IiwiQmVsb3dDaGVzdCIsIk1pZENoZXN0Qm90dG9tIiwiTWlkQ2hlc3RDZW50ZXIiLCJNaWRDaGVzdFRvcCIsCiAgICAgICAgICAgICJNaWRGYWNlQm90dG9tIiwiTWlkRmFjZUNlbnRlciIsIk1pZEZhY2VUb3AiKSkpCgpnZ3Bsb3QoaGVhdG1hcF9raWRzMiwgYWVzKHggPSBsYW5nLCB5ID0gYW9pKSkgKwogIGdlb21fdGlsZShhZXMoZmlsbD1wZXJjZW50KSxjb2xvcj0ibGlnaHRncmF5IixuYS5ybT1UUlVFKSArIAojICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInZpcmlkaXMiLCBkaXJlY3Rpb249LTEsIGxpbWl0cyA9IGMoMCwuNyksIGxhYmVscyA9IHBlcmNlbnQsIG5hbWUgPSAibG9va2luZyB0aW1lIikgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiI2ZmZmZmZiIsIGhpZ2ggPSAiIzA4NTE5YyIsIHNwYWNlID0gIkxhYiIsIGxpbWl0cyA9IGMoMCwuNTIpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIsIG5hLnZhbHVlID0gImdyZXk1MCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBjb2xvciA9ICJibGFjayIsIGZhY2UgPSAiaXRhbGljIiksIAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gIndoaXRlIiwgZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAid2hpdGUiKSkgKwogIHlsYWIoIiIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCJFeWUgR2F6ZSBIZWF0IE1hcCwgYnkgTGFuZ3VhZ2UgKENvbGxhcHNlZCBieSBEaXJlY3Rpb24iKSArIAogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kPWMoMCwwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLDApKQpgYGAKCgojIyBGb3IgcG9zdGVyPyAKYGBge3IgZmlnLndpZHRoID0gNi41LCBmaWcuaGVpZ2h0ID0gNn0KZ2dwbG90KGhlYXRtYXBfa2lkcywgYWVzKHggPSBkaXJlY3Rpb24sIHkgPSBhb2kpKSArCiAgZ2VvbV90aWxlKGFlcyhmaWxsPXBlcmNlbnQpLCAKICAgICAgICAgICAgY29sb3I9ImRhcmsgZ3JheSIsIAogICAgICAgICAgICBzaXplID0gMC4yNSwgCiAgICAgICAgICAgIG5hLnJtPVQsIAogICAgICAgICAgICBoZWlnaHQgPSByZXAoYygxMCw0LDEsMSwxLDEsMSwxKSw0KQogICAgICAgICAgICApICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiI2ZmZmZmZiIsIAogICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICIjMDg1MTljIiwgCiAgICAgICAgICAgICAgICAgICAgICBzcGFjZSA9ICJMYWIiLCAKICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwuNTIpLCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIAogICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJsb29raW5nIHRpbWUiLCAKICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk1MCIpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIkV5ZSBHYXplIEhlYXQgTWFwLCBieSBMYW5ndWFnZSIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChzaXplID0gMiksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIGZpbGwgPSBGQUxTRSkKYGBgCgoKCgpgYGB7cn0KIyBBbGwgRGF0YQojSGVyZSdzIGFsbCBBT0kgZGF0YS4gCgpraWRzICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShsYW5nLCBuYW1lLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBvcGVueGxzeDo6d3JpdGUueGxzeCgifi9EZXNrdG9wL2tpZHNfYnlfZGlyZWN0aW9uLnhsc3giKQoKa2lkcyAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkobGFuZywgbmFtZSwgZGlyZWN0aW9uLCBhb2kpICU+JQogIHN1bW1hcmlzZShwZXJjZW50ID0gbWVhbihwZXJjZW50LCBuYS5ybT1UUlVFKSkgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uLCBhb2kpICU+JQogIHN1bW1hcmlzZShwZXJjZW50ID0gbWVhbihwZXJjZW50LCBuYS5ybT1UUlVFKSkgJT4lCiAgZ3JvdXBfYnkobGFuZywgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIG9wZW54bHN4Ojp3cml0ZS54bHN4KCJ+L0Rlc2t0b3Ava2lkc19jb2xsYXBzZWQueGxzeCIpCmBgYAoKIyBEaXNjdXNzaW9uCk5vIGJpZyBjaGFuZ2VzIGZyb20gdGhlIElDU0xBIGFic3RyYWN0LiBHb29kISAKClRoZSBpbnRlcnByZXRhdGlvbiBoZXJlIGlzIHRoYXQ6CgoqIEFsbCBraWRzIGxvb2tlZCBlcXVhbGx5IGF0IGFsbCB2aWRlb3MgcmVnYXJkbGVzcyBvZiBsYW5ndWFnZSBvciBkaXJlY3Rpb24uIEFnZSBkaWQgaGF2ZSBhbiBlZmZlY3Qgc28gd2UgdXNlZCBhZ2UgaW4gb3VyIG1vZGVscy4gR29vZCEKKiBTRSBraWRzIGNvbnRpbnVlIHRvIGJlIHN0cm9uZyBmYWNlLWxvb2tlcnMgY29tcGFyZWQgdG8gTlNFIGtpZHMuICAoU2FtZSBhcyBJQ1NMQSkKKiBUaGVyZSBpcyBubyByZXZlcnNhbCBlZmZlY3QuIChTYW1lIGFzIElDU0xBKQoKVGhhdCBkb2Vzbid0IG1lYW4gYm90aCBncm91cHMgb2YgY2hpbGRyZW4gZG9uJ3QgY2FyZSBhYm91dCByZXZlcnNhbC4gT24gdGhlIGNvbnRyYXJ5LiBXZSBjYW4gaHlwb3RoZXNpemUgdGhhdCBTRSBraWRzIGhhdmUgZWZmaWNpZW50IGdhemUgYmVoYXZpb3IgYW5kIGFyZSByZXNpbGllbnQgdG8gcmV2ZXJzYWw7IHdoaWxlIE5TRSBraWRzIGFscmVhZHkgYXJlICJpbmVmZmljaWVudCIgYW5kIGNoYW5naW5nIHRoZSB2aWRlbyBzdGltdWx1cyBpc24ndCBnb2luZyB0byBoZWxwLiBCdXQgaG93IGRvIHdlIHRlc3QgdGhhdD8gTWF5YmUgbGV0J3MgbG9vayBhdCB3aXRoaW4tc3ViamVjdCB2YXJpYXRpb24uCgojIENvcnJlbGF0aW9ucwpMZXQncyB0cnkgY29ycmVsYXRpb25zLgpgYGB7ciBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTJ9CiMgTGV0J3MgdHJ5IGNvcnJlbGF0aW9ucwpraWRzX25zZSA8LSBraWRzICU+JSAKICBmaWx0ZXIoYW9pICVpbiUgbWlkbGluZSkgJT4lCiAgZmlsdGVyKGxhbmcgPT0gIk5TRSIpICU+JQogIGdyb3VwX2J5KG5hbWUsIGRpcmVjdGlvbiwgYW9pKSAlPiUgCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGNhc2Vfd2hlbigKICAgIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIgfiAiZnciLAogICAgZGlyZWN0aW9uID09ICJyZXZlcnNlZCIgfiAicnYiCiAgKSkgJT4lIAogIHVuaXRlKGFvaTIsIGRpcmVjdGlvbiwgYW9pLCBzZXAgPSAiXyIpICU+JQogIHNwcmVhZChhb2kyLCBwZXJjZW50KSAlPiUKICBzZWxlY3QoLW5hbWUpCgpraWRzX3NlIDwtIGtpZHMgJT4lIAogIGZpbHRlcihhb2kgJWluJSBtaWRsaW5lKSAlPiUKICBmaWx0ZXIobGFuZyA9PSAiU0UiKSAlPiUKICBncm91cF9ieShuYW1lLCBkaXJlY3Rpb24sIGFvaSkgJT4lIAogIHN1bW1hcmlzZShwZXJjZW50ID0gbWVhbihwZXJjZW50KSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShkaXJlY3Rpb24gPSBjYXNlX3doZW4oCiAgICBkaXJlY3Rpb24gPT0gImZvcndhcmQiIH4gImZ3IiwKICAgIGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiIH4gInJ2IgogICkpICU+JSAKICB1bml0ZShhb2kyLCBkaXJlY3Rpb24sIGFvaSwgc2VwID0gIl8iKSAlPiUKICBzcHJlYWQoYW9pMiwgcGVyY2VudCkgJT4lCiAgc2VsZWN0KC1uYW1lKQoKZ2djb3JyKGtpZHNfbnNlLCBsYWJlbCA9IFRSVUUsIGxhYmVsX3NpemUgPSA1LCBsYWJlbF9yb3VuZCA9IDIsIGxhYmVsX2FscGhhID0gVFJVRSwgaGp1c3QgPSAwLjksIHNpemUgPSA1LCBjb2xvciA9ICJncmV5NTAiLCBsYXlvdXQuZXhwID0gMSkgKyBnZ3RpdGxlKCJOU0UiKQoKZ2djb3JyKGtpZHNfc2UsIGxhYmVsID0gVFJVRSwgbGFiZWxfc2l6ZSA9IDUsIGxhYmVsX3JvdW5kID0gMiwgbGFiZWxfYWxwaGEgPSBUUlVFLCBoanVzdCA9IDAuOSwgc2l6ZSA9IDUsIGNvbG9yID0gImdyZXk1MCIsIGxheW91dC5leHAgPSAxKSArIGdndGl0bGUoIlNFIikKCmxpYnJhcnkoY29ycnIpCmtpZHNfbnNlICU+JSBjb3JyZWxhdGUoKSAlPiUgbmV0d29ya19wbG90KG1pbl9jb3I9MC42KSArIGdndGl0bGUoIk5TRSBDaGlsZHJlbiIpCmtpZHNfc2UgJT4lIGNvcnJlbGF0ZSgpICU+JSBuZXR3b3JrX3Bsb3QobWluX2Nvcj0wLjYpICsgZ2d0aXRsZSgiU0UgQ2hpbGRyZW4iKQoKYGBgCgojIFhZIFNwYWNlIERhdGEKV2UnbGwgbG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBgY2hpbGR4eWRhdGEuZmVhdGhlcmAgZmlsZSBtYWRlIGluIDA2cmF3eHlkYXRhLlJtZC4gU28gYW55IG5ldyBraWRzLCBwbGVhc2UgcnVuIHRoZSBmaXJzdCBjb2RlIGJsb2NrIGluIDA2IHRvIGluY2x1ZGUgaXQuIFRoZW4gd2UnbGwga2VlcCBhbGwgdGhlIGtpZHMgd2UgYWxzbyBoYXZlIGluIHRoZSBBT0kgZGF0YSBncm91cC4gCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQppbmNsdWRlZCA8LSBraWRzICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QobmFtZSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lCiAgdW5saXN0KCkKCnh5ZGF0YSA8LSByZWFkX2ZlYXRoZXIoIi4uL0NoaWxkIERhdGEvY2hpbGR4eWRhdGEuZmVhdGhlciIpICU+JQogIHJlbmFtZShuYW1lID0gcGFydGljaXBhbnQpICU+JQogIGZpbHRlcihuYW1lICVpbiUgaW5jbHVkZWQpCgojIEdldCBhZ2VzCmFnZXMgPC0gcmVhZF9jc3YoImNoaWxkcmVuYWdlcy5jc3YiKSAlPiUKICByZW5hbWUobmFtZSA9IHBhcnRpY2lwYW50KQp4eWRhdGEgPC0geHlkYXRhICU+JSBsZWZ0X2pvaW4oYWdlcywgYnkgPSAibmFtZSIpICU+JQogIG11dGF0ZShhZ2UgPSBhZ2UqMTIpICU+JQogIG11dGF0ZShhZ2Vncm91cCA9IGNhc2Vfd2hlbigKICAgIGFnZSA8PSA4Ljk5IH4gInlvdW5nZXIiLAogICAgYWdlID49IDkuMCAmIGFnZSA8IDE1IH4gIm9sZGVyIgogICkpICU+JQogIG11dGF0ZShsYW5ndWFnZSA9IGNhc2Vfd2hlbigKICAgIGxhbmd1YWdlID09ICJFbmdsaXNoRXhwb3NlZCIgfiAiTlNFIiwKICAgIGxhbmd1YWdlID09ICJTaWduTGFuZ3VhZ2VFeHBvc2VkIiB+ICJTRSIKICApKSAlPiUKICByZW5hbWUobGFuZyA9IGxhbmd1YWdlKSAlPiUKICBzZWxlY3QobmFtZSwgZ3JvdXAsIGdlbmRlciwgbGFuZywgY29uZGl0aW9uLCBtYXJrLCB0cmlhbCwgcmVwZXRpdGlvbiwgeCwgeSwgYWdlLCBhZ2Vncm91cCkgJT4lCiAgc2VwYXJhdGUoY29uZGl0aW9uLCBpbnRvID0gYygic3RvcnkiLCAiY2xpcCIsICJkaXJlY3Rpb24iKSkgJT4lCiAgdW5pdGUoInN0b3J5IiwgYygic3RvcnkiLCAiY2xpcCIpKSAlPiUKICBtdXRhdGUoZGlyZWN0aW9uID0gY2FzZV93aGVuKAogICAgZGlyZWN0aW9uID09ICJFUiIgfiAicmV2ZXJzZWQiLAogICAgZGlyZWN0aW9uID09ICJGVyIgfiAiZm9yd2FyZCIKICApKSAlPiUKICBtdXRhdGUobmFtZSA9IGZhY3RvcihuYW1lKSwKICAgICAgICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXApLAogICAgICAgICBnZW5kZXIgPSBmYWN0b3IoZ2VuZGVyKSwKICAgICAgICAgbGFuZyA9IGZhY3RvcihsYW5nKSwKICAgICAgICAgc3RvcnkgPSBmYWN0b3Ioc3RvcnkpLAogICAgICAgICBkaXJlY3Rpb24gPSBmYWN0b3IoZGlyZWN0aW9uKSwKICAgICAgICAgbWFyayA9IGZhY3RvcihtYXJrKSwKICAgICAgICAgdHJpYWwgPSBmYWN0b3IodHJpYWwpLAogICAgICAgICByZXBldGl0aW9uID0gZmFjdG9yKHJlcGV0aXRpb24pLAogICAgICAgICBhZ2Vncm91cCA9IGZhY3RvcihhZ2Vncm91cCkpCmBgYAoKIyMgT3ZlcmFsbCBMb29raW5nCkxldCdzIGNoZWNrIHRoYXQgd2UgaGF2ZSBubyBzaWduaWZpY2FudCBncm91cCBvciBjb25kaXRpb24gZGlmZmVyZW5jZXMgaW4gdGVybXMgb2YgdmFsaWQgKG5vdCBlbXB0eSkgZGF0YSBwb2ludHMgY29sbGVjdGVkLiBUaGlzIGlzIHNhbWUgYXMgIkdsb2JhbCBMb29raW5nIiB3ZSBoYXZlIGFib3ZlLCByZWFsbHksIGJ1dCB3IHJhdyB4eSBkYXRhLiAKCmBgYHtyfQp4eV9vdmVyYWxsIDwtIHh5ZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHgpKSAlPiUKICBncm91cF9ieShuYW1lLCBhZ2UsIGxhbmcsIGRpcmVjdGlvbiwgc3RvcnksIHJlcGV0aXRpb24pICU+JQogIHN1bW1hcmlzZShkYXRhX3BvaW50cyA9IG4oKSkgIyBnZXRzIHRvdGFsIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCB0cmlhbCBmb3IgZWFjaCBiYWJ5CgojIFRhYmxlIG9mIG1lYW5zCnh5X292ZXJhbGwgJT4lIAogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGRhdGFfcG9pbnRzID0gbWVhbihkYXRhX3BvaW50cykpICU+JSAjIGdldCBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kYXRhX3BvaW50cyA9IG1lYW4oZGF0YV9wb2ludHMpLAogICAgICAgICAgICBjb3VudCA9IG4oKSwKICAgICAgICAgICAgc2QgPSBzZChkYXRhX3BvaW50cyksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JQogIHNlbGVjdCgtc2QpICU+JQogIHByaW50KCkKCmdncGxvdCh4eV9vdmVyYWxsLCBhZXMoeCA9IGFnZSwgeSA9IGRhdGFfcG9pbnRzLCBjb2xvciA9IGRpcmVjdGlvbiwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGdndGl0bGUoIkRhdGEgUG9pbnRzIikgKwogIHhsYWIoImFnZSAobW9udGhzKSIpICsKICB5bGFiKCJkYXRhIHBvaW50cyByZWNvcmRlZCIpICsgCiAgdGhlbWVfYncoKSAKYGBgCgoKRGVzY3JpcHRpb24uCgpgYGB7cn0Kb3ZlcmFsbF94eV9sbSA8LSBsbWVyKGRhdGFfcG9pbnRzIH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArIChkaXJlY3Rpb258bmFtZSkgKyAoZGlyZWN0aW9ufHN0b3J5KSwgZGF0YSA9IHh5X292ZXJhbGwpCnN1bW1hcnkob3ZlcmFsbF94eV9sbSkgCmNvbmZpbnQob3ZlcmFsbF94eV9sbSkKI2dnY29lZihvdmVyYWxsX3h5X2xtKQpgYGAKCiMjIFhZIERhdGEgTE1NcwpOb3cgd2UncmUgZ29pbmcgdG8gcnVuIExNTXMgb24gYmFiaWVzJyByYXc6IAoKKiBob3Jpem9udGFsIHNwcmVhZCAobWlkZGxlIDUwJSBvZiB4IGRhdGE7IHhJUVIpCiogdmVydGljYWwgc3ByZWFkIChtaWRkbGUgNTAlIG9mIHkgZGF0YTsgeUlRUikKKiB2aWV3aW5nIGFyZWEgKEEgPSBtaWRkbGUteCAqIG1pZGRsZS15OyBhcmVhKQoKQnV0IHRvIGRvIHRoaXMgd2UgZmlyc3QgdHJpbSBlYWNoIGtpZCdzIGRhdGEsIGdldHRpbmcgcmlkIG9mIHRoZSBmaXJzdCA2MCBzYW1wbGVzICgwLjUwIHNlY3MpIG9mIGVhY2ggdHJpYWwuIAoKYGBge3J9Cnh5ZGF0YSA8LSB4eWRhdGEgJT4lCiAgZ3JvdXBfYnkobmFtZSx0cmlhbCkgJT4lCiAgc2xpY2UoMzA6bigpKQoKaXFyIDwtIHh5ZGF0YSAlPiUKICBncm91cF9ieShuYW1lLCBhZ2UsIGxhbmcsIHN0b3J5LCBkaXJlY3Rpb24sIHRyaWFsKSAlPiUKICBzdW1tYXJpc2UoeElRUiA9IElRUih4LG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeUlRUiA9IElRUih5LG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeG1lZCA9IG1lZGlhbih4LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHltZWQgPSBtZWRpYW4oeSwgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICBhcmVhID0geElRUip5SVFSKQpoZWFkKGlxciwyMCkKCmBgYAoKCiMjIyBNaWRkbGUgWApEZXNjcmlwdGlvbi4KCmBgYHtyfQp4aXFyX21lYW4gPC0gaXFyICU+JSAKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIG5hbWUpICU+JQogIHN1bW1hcmlzZSh4SVFSID0gbWVhbih4SVFSLCBuYS5ybSA9IFQpKSAlPiUgIyBnZXRzIGF2ZXJhZ2UgbG9va2luZyBwZXJjZW50IGZvciBlYWNoIGJhYnkKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShtZWFuX3hJUVIgPSBtZWFuKHhJUVIpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoeElRUiksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JQogIHNlbGVjdCgtc2QpICU+JQogIHByaW50KCkKCiMgUGxvdApnZ3Bsb3QoaXFyLCBhZXMoeCA9IGFnZSwgeSA9IHhJUVIsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsKICBnZ3RpdGxlKCJIb3Jpem9udGFsIFNwcmVhZCIpICsKICB4bGFiKCIiKSArCiAgeWxhYigieElRUiIpCgpnZ3Bsb3QoeGlxcl9tZWFuLCBhZXMoeCA9IGxhbmcsIHkgPSBtZWFuX3hJUVIsIGZpbGwgPSBkaXJlY3Rpb24pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl94SVFSLXNlLCB5bWF4ID0gbWVhbl94SVFSK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuMikgKwogIHRoZW1lX2xpbmVkcmF3KCkKCnhpcXJfbG0gPC0gbG1lcih4SVFSIH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0gaXFyKQpzdW1tYXJ5KHhpcXJfbG0pCmNvbmZpbnQoeGlxcl9sbSkKI2dnY29lZih4aXFyX2xtKQpgYGAKCgojIyMgTWlkZGxlIFkKRGVzY3JpcHRpb24uCgpgYGB7cn0KeWlxcl9tZWFuIDwtIGlxciAlPiUgCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uLCBuYW1lKSAlPiUKICBzdW1tYXJpc2UoeUlRUiA9IG1lYW4oeUlRUiwgbmEucm0gPSBUKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbl95SVFSID0gbWVhbih5SVFSKSwgIyBnZXRzIGdyb3VwIGF2ZXJhZ2VzCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZCA9IHNkKHlJUVIpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgojIFBsb3QKZ2dwbG90KGlxciwgYWVzKHggPSBhZ2UsIHkgPSB5SVFSLCBjb2xvciA9IGRpcmVjdGlvbiwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgZ2d0aXRsZSgiVmVydGljYWwgU3ByZWFkIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJ5SVFSIikKCmdncGxvdCh5aXFyX21lYW4sIGFlcyh4ID0gbGFuZywgeSA9IG1lYW5feUlRUiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3lJUVItc2UsIHltYXggPSBtZWFuX3lJUVIrc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC4yKSArCiAgdGhlbWVfbGluZWRyYXcoKQoKeWlxcl9sbSA8LSBsbWVyKHlJUVIgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBpcXIpCnN1bW1hcnkoeWlxcl9sbSkKY29uZmludCh5aXFyX2xtKQojZ2djb2VmKHlpcXJfbG0pCmBgYAoKIyMjIFZpZXdpbmcgQXJlYQpEZXNjcmlwdGlvbi4KCmBgYHtyfQphcmVhX21lYW4gPC0gaXFyICU+JSAKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIG5hbWUpICU+JQogIHN1bW1hcmlzZShhcmVhID0gbWVhbihhcmVhLCBuYS5ybSA9IFQpKSAlPiUgIyBnZXRzIGF2ZXJhZ2UgbG9va2luZyBwZXJjZW50IGZvciBlYWNoIGJhYnkKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShhcmVhX21lYW4gPSBtZWFuKGFyZWEpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoYXJlYSksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JQogIHNlbGVjdCgtc2QpICU+JQogIHByaW50KCkKCiMgUGxvdApnZ3Bsb3QoaXFyLCBhZXMoeCA9IGFnZSwgeSA9IGFyZWEsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsKICBnZ3RpdGxlKCJWaWV3aW5nIEFyZWEiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIkFyZWEgKHB4XjIpIikKCmdncGxvdChhcmVhX21lYW4sIGFlcyh4ID0gbGFuZywgeSA9IGFyZWFfbWVhbiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBhcmVhX21lYW4tc2UsIHltYXggPSBhcmVhX21lYW4rc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC4yKSArCiAgdGhlbWVfbGluZWRyYXcoKQoKYXJlYV9sbSA8LSBsbWVyKGFyZWEgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBpcXIpCnN1bW1hcnkoYXJlYV9sbSkKY29uZmludChhcmVhX2xtKQojZ2djb2VmKGFyZWFfbG0pCmBgYAoKIyMgUGxvdHRpbmcgVmlld2luZyBBcmVhIAoKYGBge3J9Cm1lZGlhbnMgPC0gaXFyICU+JQogIGdyb3VwX2J5KG5hbWUsbGFuZyxkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZSh4SVFSID0gbWVhbih4SVFSLG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeUlRUiA9IG1lYW4oeUlRUixuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHhtZWQgPSBtZWFuKHhtZWQsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICB5bWVkID0gbWVhbih5bWVkLG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShsYW5nLGRpcmVjdGlvbikgJT4lIAogIHN1bW1hcmlzZSh4SVFSID0gbWVhbih4SVFSLG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeUlRUiA9IG1lYW4oeUlRUixuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHggPSBtZWFuKHhtZWQsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICB5ID0gbWVhbih5bWVkLG5hLnJtPVRSVUUpKSAlPiUKICBtdXRhdGUoeSA9IHkqLTEsCiAgICAgICAgIHhtaW4gPSB4LSh4SVFSLzIpLAogICAgICAgICB4bWF4ID0geCsoeElRUi8yKSwKICAgICAgICAgeW1pbiA9IHktKHlJUVIvMiksCiAgICAgICAgIHltYXggPSB5Kyh5SVFSLzIpKQppbWcgPC0gcG5nOjpyZWFkUE5HKCJjaW5keS5wbmciKQpnIDwtIGdyaWQ6OnJhc3Rlckdyb2IoaW1nLCBpbnRlcnBvbGF0ZT1UUlVFLCB3aWR0aD11bml0KDEsIm5wYyIpLCBoZWlnaHQ9dW5pdCgxLCJucGMiKSkgCmdncGxvdChtZWRpYW5zLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwogIGFubm90YXRpb25fY3VzdG9tKGcsIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49eG1pbix5bWluPXltaW4seG1heD14bWF4LHltYXg9eW1heCksYWxwaGE9LjEpICsgCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDgwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC03MjAsMCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBmYWNldF93cmFwKCJsYW5nIikKYGBgCgojIFhZIFNwYWNlIERhdGEgLSBNdWx0aXBsZSBQbG90cwoKRmlyc3QgbGV0J3MgcHJlcCB0aGUgZGF0YS4gCmBgYHtyfQptdWx0aXBsZXMgPC0geHlkYXRhICU+JQogIGZpbHRlcighaXMubmEoeCkpICU+JQogIGZpbHRlcighaXMubmEoeSkpICU+JQogIGdyb3VwX2J5KG5hbWUsIGFnZSwgbGFuZywgc3RvcnksIGRpcmVjdGlvbiwgdHJpYWwpICU+JQogIHN1bW1hcmlzZSh4SVFSID0gSVFSKHgsbmEucm09VFJVRSksCiAgICAgICAgICAgIHlJUVIgPSBJUVIoeSxuYS5ybT1UUlVFKSwKICAgICAgICAgICAgeG1lZCA9IG1lZGlhbih4LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgeW1lZCA9IG1lZGlhbih5LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgYXJlYSA9IHhJUVIqeUlRUiwKICAgICAgICAgICAgeF85MCA9IHF1YW50aWxlKHgsIC45NSwgbmEucm09VFJVRSkgLSBxdWFudGlsZSh4LCAuMDUsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICB5XzkwID0gcXVhbnRpbGUoeSwgLjk1LCBuYS5ybT1UUlVFKSAtIHF1YW50aWxlKHksIC4wNSwgbmEucm09VFJVRSksCiAgICAgICAgICAgIGFyZWFfOTAgPSAoeF85MCkgKiAoeV85MCksCiAgICAgICAgICAgIHhfbWVhbiA9IG1lYW4oeCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgeV9tZWFuID0gbWVhbih5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICB4X3NkID0gc2QoeCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgeV9zZCA9IHNkKHksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHhfMXNkID0gKHhfbWVhbit4X3NkKSAtICh4X21lYW4teF9zZCksCiAgICAgICAgICAgIHlfMXNkID0gKHlfbWVhbit5X3NkKSAtICh5X21lYW4teV9zZCksCiAgICAgICAgICAgIGFyZWFfMXNkID0geF8xc2QgKiB5XzFzZCwKICAgICAgICAgICAgeF8yc2QgPSAoeF9tZWFuKyh4X3NkKjIpKSAtICh4X21lYW4tKHhfc2QqMikpLAogICAgICAgICAgICB5XzJzZCA9ICh5X21lYW4rKHlfc2QqMikpIC0gKHlfbWVhbi0oeV9zZCoyKSksCiAgICAgICAgICAgIGFyZWFfMnNkID0geF8yc2QgKiB5XzJzZCkgJT4lCiAgZ3JvdXBfYnkobmFtZSwgbGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2VfaWYoaXMuZG91YmxlLCBmdW5zKG1lYW4pLCBuYS5ybSA9IFQpICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlX2lmKGlzLmRvdWJsZSwgZnVucyhtZWFuKSwgbmEucm0gPSBUKQoKaW1nIDwtIHBuZzo6cmVhZFBORygiY2luZHkucG5nIikKZyA8LSBncmlkOjpyYXN0ZXJHcm9iKGltZywgaW50ZXJwb2xhdGU9VFJVRSwgd2lkdGg9dW5pdCgxLCJucGMiKSwgaGVpZ2h0PXVuaXQoMSwibnBjIikpIAoKYGBgCgojIyBJUVIgKE1pZGRsZSA1MCUpCkxldCdzIHNlZS4gCmBgYHtyfQpjdXJyX2RhdGEgPC0gbXVsdGlwbGVzICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGxhbmcsIGRpcmVjdGlvbiwgeG1lZCwgeW1lZCwgeElRUiwgeUlRUikgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoeG1pbiA9IHhtZWQtKHhJUVIvMiksCiAgICAgICAgIHhtYXggPSB4bWVkKyh4SVFSLzIpLAogICAgICAgICB5bWluID0gLTEqKHltZWQtKHlJUVIvMikpLAogICAgICAgICB5bWF4ID0gLTEqKHltZWQrKHlJUVIvMikpKQoKZ2dwbG90KGN1cnJfZGF0YSwgYWVzKGZpbGw9ZGlyZWN0aW9uLGNvbG9yPWRpcmVjdGlvbikpICsKICBhbm5vdGF0aW9uX2N1c3RvbShnLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4xKSArIAogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTA4MCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgZmFjZXRfd3JhcCgibGFuZyIpCmBgYAoKIyMgTWlkZGxlIDkwJQpTbyBJIGNhbGN1bGF0ZWQgdGhlIGF2ZXJhZ2UgbWVkaWFuIGFjcm9zcywgYW5kIHRoZSBtaWRkbGUgOTAlIG9mIHRoZSBkYXRhLiAKYGBge3J9CmN1cnJfZGF0YSA8LSBtdWx0aXBsZXMgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QobGFuZywgZGlyZWN0aW9uLCB4bWVkLCB5bWVkLCB4XzkwLCB5XzkwKSAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZSh4bWluID0geG1lZC0oeF85MC8yKSwKICAgICAgICAgeG1heCA9IHhtZWQrKHhfOTAvMiksCiAgICAgICAgIHltaW4gPSAtMSooeW1lZC0oeV85MC8yKSksCiAgICAgICAgIHltYXggPSAtMSooeW1lZCsoeV85MC8yKSkpCgpnZ3Bsb3QoY3Vycl9kYXRhLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwogIGFubm90YXRpb25fY3VzdG9tKGcsIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49eG1pbix5bWluPXltaW4seG1heD14bWF4LHltYXg9eW1heCksYWxwaGE9LjEpICsgCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDgwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC03MjAsMCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBmYWNldF93cmFwKCJsYW5nIikKCiMgZ2dwbG90KGZpbHRlcihjdXJyX2RhdGEsIGxhbmcgPT0gIk5TRSIpLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwojICAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwojICAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4yLCBzaXplID0gMSkgKwojICAgdGhlbWVfbGluZWRyYXcoKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKQojIAojIAojIGdncGxvdChmaWx0ZXIoY3Vycl9kYXRhLCBsYW5nID09ICJTRSIpLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwojICAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwojICAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4yLCBzaXplID0gMSkgKwojICAgdGhlbWVfbGluZWRyYXcoKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKQpgYGAKCiMjIMKxMSBTRCAoTWlkZGxlIDY4JSkKU28gdGhpcyBpcyB1c2luZyB0aGUgbWVhbiBvZiB0aGUgbWVhbnMsIHBsdXMgb3IgbWludXMgb25lIFNELiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIG1pZGRsZSA2OCUuIApgYGB7cn0KY3Vycl9kYXRhIDwtIG11bHRpcGxlcyAlPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChsYW5nLCBkaXJlY3Rpb24sIHhfbWVhbiwgeV9tZWFuLCB4XzFzZCwgeV8xc2QpICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKHhtaW4gPSB4X21lYW4tKHhfMXNkLzIpLAogICAgICAgICB4bWF4ID0geF9tZWFuKyh4XzFzZC8yKSwKICAgICAgICAgeW1pbiA9IC0xKih5X21lYW4tKHlfMXNkLzIpKSwKICAgICAgICAgeW1heCA9IC0xKih5X21lYW4rKHlfMXNkLzIpKSkKCmdncGxvdChjdXJyX2RhdGEsIGFlcyhmaWxsPWRpcmVjdGlvbixjb2xvcj1kaXJlY3Rpb24pKSArCiAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwogIGdlb21fcmVjdChhZXMoeG1pbj14bWluLHltaW49eW1pbix4bWF4PXhtYXgseW1heD15bWF4KSxhbHBoYT0uMSkgKyAKICB0aGVtZV9saW5lZHJhdygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTcyMCwwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIGZhY2V0X3dyYXAoImxhbmciKQpgYGAKCiMjIMKxMiBTRCAoTWlkZGxlIDk2JSkKQW5kIHRoaXMgaXMgdXNpbmcgdGhlIG1lYW4gb2YgdGhlIG1lYW5zLCBwbHVzIG9yIG1pbnVzIHR3byBTRC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBtaWRkbGUgOTYlLiAKYGBge3J9CmN1cnJfZGF0YSA8LSBtdWx0aXBsZXMgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QobGFuZywgZGlyZWN0aW9uLCB4X21lYW4sIHlfbWVhbiwgeF8yc2QsIHlfMnNkKSAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZSh4bWluID0geF9tZWFuLSh4XzJzZC8yKSwKICAgICAgICAgeG1heCA9IHhfbWVhbisoeF8yc2QvMiksCiAgICAgICAgIHltaW4gPSAtMSooeV9tZWFuLSh5XzJzZC8yKSksCiAgICAgICAgIHltYXggPSAtMSooeV9tZWFuKyh5XzJzZC8yKSkpCgpnZ3Bsb3QoY3Vycl9kYXRhLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwogIGFubm90YXRpb25fY3VzdG9tKGcsIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49eG1pbix5bWluPXltaW4seG1heD14bWF4LHltYXg9eW1heCksYWxwaGE9LjEpICsgCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDgwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC03MjAsMCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBmYWNldF93cmFwKCJsYW5nIikKYGBg